package it.unipd.dei.bd.icineasti.database;

import it.unipd.dei.bd.icineasti.resource.Evento;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

/**
 * Restituisce una lista degli eventi extra/non film in programmazione in una sede scelta
 * 
 * @author Morris Antonello
 * Modificato da Coccato Mattia: tolta locandina da query
 *
 */

public class GetEventiExtraFromSedeDatabase {


	private static final String STATEMENT = "(SELECT DISTINCT Evento.codice, Evento.titolo, Evento.descrizione, Evento.durataInSala, Evento.durataProiezione " +
											"FROM Evento, Palinsesto, Spettacolo " +
											"WHERE	Evento.Codice = Palinsesto.CodiceEvento AND " +
												"Spettacolo.CodicePalinsesto = Palinsesto.Codice AND " +
												"Palinsesto.DataOra >= current_timestamp AND " +
												"CAST (Spettacolo.dataPrenotabile AS DATE) <= CAST (current_timestamp AS DATE) AND " +
												"Spettacolo.Codice IN ( " +
													"SELECT R_Proiettato.CodiceSpettacolo " +
													"FROM R_Proiettato, Sala " +
													"WHERE 	Sala.IDSala = R_Proiettato.IDSala AND " +
													"Sala.CodiceSede = ?)) " +
											"EXCEPT " +
											"(SELECT Evento.codice, Evento.titolo, Evento.descrizione, Evento.durataInSala, Evento.durataProiezione " +
											"FROM Film, Evento, Palinsesto, Spettacolo " +
											"WHERE	Film.Codice = Evento.Codice AND " +
												"Evento.Codice = Palinsesto.CodiceEvento AND " +
												"Spettacolo.CodicePalinsesto = Palinsesto.Codice AND " +
												"Palinsesto.DataOra >= current_timestamp AND " +
												"CAST (Spettacolo.dataPrenotabile AS DATE) <= CAST (current_timestamp AS DATE) AND " +
												"Spettacolo.Codice IN ( " +
													"SELECT R_Proiettato.CodiceSpettacolo " +
													"FROM R_Proiettato, Sala " +
													"WHERE 	Sala.IDSala = R_Proiettato.IDSala AND " +
													"Sala.CodiceSede = ?))";
													
											// da togliere la locandina
											// eventi data una sede EXCEPT film data la sede	
											// Spettacolo.Valido = true al posto di Palinsesto.DataOra >= ?
											// ulteriori inner join in alternativa alle query annidate
											// current_timestamp al posto di ? e dataOggi

	/**
	 * Connessione al database
	 */
	private final Connection con;
	
	/**
	 * Risultati della ricerca
	 */
	private final List<Evento> eventi;
	
	private final int codiceSede;
	
	private final Date dataOggi;

	public GetEventiExtraFromSedeDatabase(Connection con, int codiceSede, Date dataOggi) {
		this.con = con;
		this.codiceSede = codiceSede;
		this.dataOggi = dataOggi;
		eventi = new ArrayList<Evento>();
	}

	public List<Evento> getEventiExtraFromSede() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			pstmt = con.prepareStatement(STATEMENT);
			//pstmt.setDate(1, dataOggi);
			//pstmt.setDate(2, dataOggi);
			pstmt.setInt(1, codiceSede);
			//pstmt.setDate(4, dataOggi);
			//pstmt.setDate(5, dataOggi);
			pstmt.setInt(2, codiceSede);
			rs = pstmt.executeQuery();

			while (rs.next()) {
				eventi.add(
							 new Evento(
									 	rs.getInt("codice"),
										null,
										rs.getString("titolo"), 
										rs.getString("descrizione"),
										rs.getInt("durataInSala"),
										rs.getInt("durataProiezione")
									 	)
						    );
			}
		} finally {
			if (rs != null) {
				rs.close();
			}

			if (pstmt != null) {
				pstmt.close();
			}

			con.close();
		}

		return eventi;
	}
}
